package com.mofeng.myshop.service.user;


import com.mofeng.myshop.domain.po.UserBase;
import com.mofeng.myshop.domain.vo.user.UserVo;
import com.mofeng.myshop.until.R;

/**
 * 用户操作相关的工具类接口
 */
public interface UserUtilsService {
    /**
     * 查看图灵码验证状态，验证一次后，五分钟内不用重复输入验证码
     *
     * @return true 状态正常，
     */
    Boolean checkCaptchaState();

    /**
     * 用户修改密码时，邮箱验证
     *
     * @param email     邮箱
     * @param emailCode 邮箱验证码
     */
    R checkEmailCode(String email, String emailCode);

    /**
     * 邮箱发送验证码
     *
     * @param type         获取邮箱验证码类型
     * @param emailAddress 邮箱
     */
    R sendEmailCode(String type, String emailAddress);

    /**
     * 手机号发送验证码
     *
     * @param type  修改类型
     * @param phone 手机号
     */
    R sendPhone(String type, String phone);

    /**
     * 判断图灵验证码是否有效
     *
     * @param captchaCode 验证码
     */
    R isCaptchaCodeRight(String captchaCode);

    UserVo parseToken();

    void getCaptchaCode();

    /**
     * 生成token
     *
     * @param user 用户信息
     * @param from 来源
     */
    String createToken(UserBase user, String from);

    /**
     * 删除用户的旧的Token信息
     *
     * @param user  用户信息
     * @param isAll 是否所有端的用户登录信息都删除
     */
    void deleteOldToken(UserVo user, boolean isAll);

    /**
     * 检查邮箱是否存在
     *
     * @param email 邮箱
     * @return false 表示没有
     */
    boolean checkEmail(String email);

    /**
     * 检查用户名是否存在
     *
     * @param userName 用户名
     * @return false 表示没有
     */
    boolean checkUserName(String userName);

    /**
     * 检查手机号是否存在
     *
     * @param phone 手机号
     * @return false 没有
     */
    boolean checkPhone(String phone);

    /**
     * 获取并且检查邮箱验证码
     *
     * @param emailOrPhone    邮箱
     * @param emailCodePortal 前端输入的邮箱/手机验证码
     */
    <T> T getAndCheckEmailCode(String emailOrPhone, String emailCodePortal);

    /**
     * 删除用户验证信息
     *
     * @param email 邮箱
     */
    void removeValidateMsg(String email);

    /**
     * 从缓存中获取且校验图灵验证码
     *
     * @param captchaCode 用户输入的图灵码
     */
    <T> T getAndCheckCaptchaContent(String captchaCode);

    /**
     * 获取登录端
     */
    String getFrom();

    /**
     * 检查登录状态（防止机器爆破密码）
     */
    void checkLoginCount(String userName);

    /**
     * 给用户发送邮件
     *
     * @param from         发件人
     * @param title        邮件标题
     * @param content      邮件内容
     * @param emailAddress 收件人
     */
    void sendEmailUser(String from, String title, String content, String emailAddress);

    /**
     * 给用户发送邮件
     *
     * @param title        邮件标题
     * @param content      邮件内容
     * @param emailAddress 收件人
     */
    void sendEmailAdmin(String title, String content, String emailAddress);
}
